package top.ooyyh.bytheway.utils;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

/**
 * 统一API响应结果封装工具类
 */
public class Result extends JSONObject {
    private static final long serialVersionUID = 1L;

    // 状态码key
    private static final String CODE_KEY = "code";
    // 消息key
    private static final String MSG_KEY = "msg";
    // 数据key
    private static final String DATA_KEY = "data";

    // 成功状态码
    private static final int SUCCESS_CODE = 200;
    // 失败状态码
    private static final int ERROR_CODE = 500;

    /**
     * 私有构造方法
     */
    private Result() {
    }

    /**
     * 成功结果(无数据)
     */
    public static Result success() {
        return success(null);
    }

    /**
     * 成功结果(带数据)
     */
    public static Result success(Object data) {
        return new Result()
                .setCode(SUCCESS_CODE)
                .setMsg("操作成功")
                .setData(data);
    }

    /**
     * 失败结果(默认消息)
     */
    public static Result error() {
        return error("操作失败");
    }

    /**
     * 失败结果(自定义消息)
     */
    public static Result error(String msg) {
        return error(ERROR_CODE, msg);
    }

    /**
     * 失败结果(自定义状态码和消息)
     */
    public static Result error(int code, String msg) {
        return new Result()
                .setCode(code)
                .setMsg(msg)
                .setData(null);
    }

    /**
     * 设置状态码
     */
    public Result setCode(int code) {
        this.put(CODE_KEY, code);
        return this;
    }

    /**
     * 获取状态码
     */
    public int getCode() {
        return this.getInt(CODE_KEY);
    }

    /**
     * 设置消息
     */
    public Result setMsg(String msg) {
        this.put(MSG_KEY, msg);
        return this;
    }

    /**
     * 获取消息
     */
    public String getMsg() {
        return this.getStr(MSG_KEY);
    }

    /**
     * 设置数据
     */
    public Result setData(Object data) {
        this.put(DATA_KEY, data);
        return this;
    }

    /**
     * 获取数据
     */
    public <T> T getData(Class<T> clazz) {
        return JSONUtil.toBean(this.getJSONObject(DATA_KEY), clazz);
    }

    /**
     * 获取原始数据
     */
    public Object getData() {
        return this.get(DATA_KEY);
    }

    /**
     * 判断是否成功
     */
    public boolean isSuccess() {
        return SUCCESS_CODE == this.getCode();
    }

    /**
     * 转换为JSON字符串
     */
    @Override
    public String toString() {
        return JSONUtil.toJsonStr(this);
    }
}
